package ilogger

import (
	"bytes"
	"io"
)

type (

	// Fields 日志扩展属性
	Fields map[string]any

	// IEntry 日志载体
	IEntry interface {
		WithField(key string, value any)
		ToMap() map[string]any // 转 map
		GetLevel() LogLevel
		Clear()                                          // 清空携带数据
		Log(level LogLevel, args ...any)                 // 组装日志
		LogF(level LogLevel, format string, args ...any) // 组装日志
		Write()                                          // 将日志数据写入对应的格式化解析器中
	}

	// ILock 通用锁定义
	ILock interface {
		Lock()    // 加锁
		UnLock()  // 解锁
		Disable() // 禁用锁
	}

	// IPrivate 对内调用的定义
	IPrivate interface {
		GetPrefix() string
		GetFormatter() IFormatter
		GetOutput() io.Writer
		GetLock() ILock
		GetBufPool() IBufferPool
		GetHooks() IHook
		IsCaller() bool
		Size() int64 // 获取当前日志大小
		Max() int64  // 获取设置的最大写入
		Rotate() error
		AppendSize(size int64)
	}

	// ILogger 日志的抽象实现
	ILogger interface {
		IPrivate
		InfoF(format string, args ...any)  // 普通日志
		Info(args ...any)                  // 普通日志
		DebugF(format string, args ...any) // 调试日志
		Debug(args ...any)                 // 调试日志
		WarnF(format string, args ...any)  // 警告日志
		Warn(args ...any)                  // 警告日志
		ErrorF(format string, args ...any) // 错误日志
		Error(args ...any)                 // 错误日志
		FailF(format string, args ...any)  // 失败日志
		Fail(args ...any)                  // 失败日志
		Close() error
	}

	// IFormatter 格式化
	IFormatter interface {
		Format(IEntry) ([]byte, error)
	}

	// IBufferPool 缓冲池定义
	IBufferPool interface {
		Put(buf *bytes.Buffer)
		Get() *bytes.Buffer
	}

	// IHookItem hook 钩子
	IHookItem interface {
		Levels() []LogLevel
		Fire(entry IEntry) error
	}

	// IHook 钩子容器
	IHook interface {
		Len() int
		Add(item IHookItem)
		Get(level LogLevel) []IHookItem
		Fire(level LogLevel, entry IEntry) error
		Execute(entry IEntry) error
	}

	IOption interface {
		WithPrefix(prefix string) IOption
		WithLevel(level LogLevel) IOption
	}
)

// EmptyField 空属性
var EmptyField = make(Fields, 1)
